﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProtocoloNameSpace;
using HTSwitchServerNamespace.DataMocks;
using HTSwitchServerNamespace.DataMocks.NuevaPlataforma;
using Newtonsoft.Json;
using HTSwitchServerNamespace.Util;
using System.Collections.Specialized;
using System.Configuration;
using System.Net.Sockets;
using ReverseGeocoding.Library;


namespace HTSwitchServerNamespace.Protocols
{
    class ProtocoloGlobalMendozaSat:IProtocol
    {
        private string tramaGlobal;

        public string TramaGlobal
        {
            get { return tramaGlobal; }
            set { tramaGlobal = value; }
        }

        public bool ObteneryEnviarDatosDelDispositivo(string strMensajeDelDispositivo,TcpClient tcpClient)
        {           
            DataMockCYSNP objGPSData = new DataMockCYSNP();
            string tramaGlobal="";
            Utils utils = new Utils();

            ComSatTranslator.ComSatTranslator consat = ComSatTranslator.ComSatTranslator.GetNewInstance();

            //ControlHorseData objContext = new ControlHorseData();

            string[] strMensaje=strMensajeDelDispositivo.Split(new char[]{'{'});
           
            //CLogger.Append("[ObteneryEnviarDatosDelDispositivo] SPLIT: "+strMensaje[1], CLogger.INFO);      //DEBUG

            string strMensajeFinal = "{" + strMensaje[1];
            #region Deserializacion de datos
            ///EJEMPLO DE ENVIO {"longitude":-122.084095,"latitude":37.422005}
            ///{"imei":"000000000000000","id":"1120","bearing":0.0,"latitude":37.422005,"longitude":-122.084095,"altitud":0.0,"precision":0.0,"velocidad":0.0} 
            objGPSData = JsonConvert.DeserializeObject<DataMockCYSNP>(strMensajeFinal);
            #endregion

                       
            try
            {
                if ((objGPSData != null) && (objGPSData.longitude != null) && (objGPSData.latitude != null))
                {

                    enviarRespuestaGlobalSat(tcpClient);
                    
                    CLogger.Append("[ObteneryEnviarDatosDelDispositivo] DATOS RECIBIDOS: LAT: "+objGPSData.latitude+" - LONG: "+objGPSData.longitude+"ID: "+objGPSData.id+" - IMEI: "+objGPSData.imei+"PRECISION: " + objGPSData.precision + " - VELOCIDAD: " + objGPSData.velocidad+"ALTITUD: " + objGPSData.altitud + " - BEARING: " + objGPSData.bearing, CLogger.INFO);
                    
                    ReverseGeocodingLibrary objReverseGeo = ReverseGeocodingLibrary.Instance();
                    
                    GoogleGeoCode objGeoCode = JsonConvert.DeserializeObject<GoogleGeoCode>(objReverseGeo.ReverseGeocode(Convert.ToDouble(objGPSData.latitude),Convert.ToDouble(objGPSData.longitude)));

                    string lati=null;
                    string longi = null;
                    if (objGeoCode.status.Equals("OK"))
                    {
                        CLogger.Append("[ObteneryEnviarDatosDelDispositivo] Coordenadas Geocodizadas - LAT: " + objGeoCode.results[0].geometry.location.lat + " - LONG: " + objGeoCode.results[0].geometry.location.lng, CLogger.INFO);

                        lati = utils.formatearLatitud(objGeoCode.results[0].geometry.location.lat, 9);
                        longi = utils.formatearLongitud(objGeoCode.results[0].geometry.location.lng, 10);
                    }
                    else 
                    {
                        lati = utils.formatearLatitud(objGPSData.latitude,9);
                        longi= utils.formatearLongitud(objGPSData.longitude,10);
                    }

                    
                    consat.Latitud = lati;
                    consat.Longitud = longi;
                    consat.IdMovil = objGPSData.id;
                    //consat.TensionDeBateria = objGPSData.battery;
                    consat.TensionDeBateria = "100";

                    double velocidad = (Convert.ToDouble(objGPSData.velocidad) * 3600) / 1000;

                    //consat.Velocidad = objGPSData.velocidad;
                    consat.Velocidad = velocidad.ToString();

                    consat.GPSFixMode = "3";
                    CLogger.Append("[ObteneryEnviarDatosDelDispositivo] DATOS FORMAT LAT: " + lati + " LONG: " + longi + " - VEL: "+velocidad, CLogger.INFO);

                    if (objGPSData.velocidad.Equals("0"))
                    {
                        //consat.Reporte = "15";
                        consat.Reporte = "16";
                    }else{
                        //consat.Reporte="01";
                        consat.Reporte = "16";
                    }
                    tramaGlobal= consat.Serialize();
                    CLogger.Append("[ObteneryEnviarDatosDelDispositivo] SERIALIZE: "+tramaGlobal , CLogger.INFO);
                    envioRecepcionDeDatosGlobalSat(tramaGlobal);


                    //////////////// CONTROL DE ALARMAS Y MOVILES /////////////////////////
                    try
                    {
                        MobileManagementDoing.MergeMobile(objGPSData.id);
                    }
                    catch(Exception ex)
                    {
                        CLogger.Append("[ObteneryEnviarDatosDelDispositivo] Exception control de alarmas y moviles:  "+ex.Message, CLogger.ERROR);
                    }
                }
                else
                {
                    CLogger.Append("[ObteneryEnviarDatosDelDispositivo] DATOS INVALIDOS O VACIOS ", CLogger.INFO);
                    return false;
                }
            }
            catch (Exception ex)
            {
                //throw new Exception("ERROR EN VALIDACION O CREACION DE NUEVO USUARIO" + objGPSAndroidData.Mail);
                CLogger.Append("[ObteneryEnviarDatosDelDispositivo] EXCEPTION " + ex.Message, CLogger.ERROR);
            }

            
            return true;
        }

     
        public string envioRecepcionDeDatosGlobalSat(string tramaGlobal)
        {
            string strHost = "";
            string strPort = "";
            string strTimeConn = "";

            NameValueCollection appSettings = ConfigurationManager.AppSettings;
            foreach (String strEntry in appSettings.AllKeys)
            {
                switch (strEntry)
                {
                    case "serverGlobalSatTCPPort":
                        strPort = appSettings[strEntry];
                        break;
                    case "serverGlobalSatIPAddress":
                        strHost = appSettings[strEntry];

                        break;
                    case "serverTimeoutSec":
                        strTimeConn = appSettings[strEntry];
                        break;
                }
            }
            UDPConnection udpConn = new UDPConnection();
            string udpReceiver = udpConn.enviarRecibirDatosUDP(strHost, Convert.ToInt32(strPort), tramaGlobal);

            return udpReceiver;

        }


        public void enviarRespuestaGlobalSat(TcpClient tcpClient)
        {
            try
            {
                NetworkStream stream = tcpClient.GetStream();
                Byte[] messageTCP = System.Text.Encoding.ASCII.GetBytes(MensajesHTTP.mensajeHTTPok());
                stream.Write(messageTCP, 0, messageTCP.Length);
                stream.Close();
            }
            catch (Exception e)
            {

                throw e;
            }

        }

    }

}
